package com.hb.config;

import com.hb.service.SpitterService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.caucho.HessianProxyFactoryBean;
import org.springframework.remoting.caucho.HessianServiceExporter;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;

import java.util.Properties;

@Configuration
public class HessianConfig {
    /**
     * 在如下 Spring 的声明中，HessianServiceExporter 会把 spitterService bean 导出为 Hessian 服务。
     *
     * @param service
     * @return
     */
    @Bean
    public HessianServiceExporter hessianServiceExporter(SpitterService service) {
        // 与RmiServiceExporter 不同的是，我们不需要设置 serviceName 属性。在 RMI 中，serviceName 属性用来在 RMI 注册表中注册一个服务。
        // 而 Hessian 没有注册表，因此也就没必要为 Hessian 服务进行命名。
        HessianServiceExporter exporter = new HessianServiceExporter();
        // 正如 RmiServiceExporter 一样，service 属性的值被设置为实现了这个服务的 bean 引用。在这里，它引用的是 spitterServicebean。
        exporter.setService(service);
        // serviceInterface 属性用来标识这个服务实现了 SpitterService 接口。
        exporter.setServiceInterface(SpitterService.class);
        return exporter;
    }

    /**
     * 我们还需要配置一个 URL 映射来确保 DispatcherServlet 把请求转给 hessianSpitterService
     * @return
     */
    @Bean
    public HandlerMapping hessianMapping() {
        SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
        Properties mappings = new Properties();
        mappings.setProperty("/spitter.service", "hessianExportedSpitterService");
        mapping.setMappings(mappings);
        return mapping;
    }

    /**
     * 客户端调用基于 Hessian 的 Spitter 服务可以用如下的配置声明。就像基于 RMI 服务那样，serviceInterface 属性指定了这个服务实现的接口。并且，
     * 像 RmiProxyFactoryBean 一样，serviceUrl 标识了这个服务的 URL。既然 Hessian 是基于 HTTP 的，当然我们在这里要设置一个 HTTP URL（ URL
     * 是由我们先前定义的 URL 映射所决定的）
     * @return
     */
    @Bean
    public HessianProxyFactoryBean spitterService() {
        HessianProxyFactoryBean proxy = new HessianProxyFactoryBean();
        proxy.setServiceUrl("http://localhost:8080/Spitter/spitter.service");
        proxy.setServiceInterface(SpitterService.class);
        return proxy;
    }
}
